package com.demo.config.apache.util;

import net.sourceforge.tess4j.ITesseract;
import net.sourceforge.tess4j.Tesseract;
import net.sourceforge.tess4j.TesseractException;
import net.sourceforge.tess4j.util.ImageHelper;
import org.springframework.beans.factory.annotation.Value;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

public class Tess4jUtil {

	@Value("${tess4j.datapath}")
	private static String dataPath = "D:\\job\\private\\demo2\\src\\main\\resources\\tessdata";

	@Value("${tess4j.defaultLang}")
	private static String defaultLang = "chi_sim";

	/**
	 * 图片文字识别
	 */
	// 定义一个名为ocrDemo的静态方法
	public static void recognizeText(String imagePath) {
		// 创建一个Tesseract实例
		Tesseract instance = new Tesseract();
		// 设置数据路径
		instance.setDatapath(dataPath);
		// 设置用户自定义的DPI值
		instance.setVariable("user_defined_dpi", "300");
		// 设置识别语言
		instance.setLanguage(defaultLang);

		try {
			// 记录开始时间
			long startTime = System.currentTimeMillis();
			// 读取图片文件并降噪转成流
			// BufferedImage bImage = ClearImageUtil.cleanImage(imagePath);
			// 使用OpenCV去噪-更精确点
			BufferedImage bImage = OpenCVUtil.denoising(imagePath);
			// 使用Tesseract进行OCR识别
			String result = instance.doOCR(bImage);
			// 输出识别结果
			System.out.println(result);

			// 记录结束时间
			long endTime = System.currentTimeMillis();
			// 计算耗时（单位：秒）
			long seconds = (endTime - startTime) / 1000;
			// 输出耗时
			System.out.println("共用时：" + seconds + "秒");

		}
		catch (TesseractException | IOException e) {
			// 抛出运行时异常
			throw new RuntimeException(e);
		}

	}

	// 使用中文字库 - 识别图片
	public static void testZh(String imagePath) throws Exception {
		File imageFile = new File(imagePath);
		BufferedImage image = ImageIO.read(imageFile);
		// 对图片进行处理
		image = convertImage(image);
		ITesseract instance = new Tesseract();
		// JNA Interface Mapping
		instance.setLanguage(defaultLang);
		// 使用中文字库
		String result = instance.doOCR(image);
		// 识别
		System.out.println(result);
	}

	// 对图片进行处理 - 提高识别度
	public static BufferedImage convertImage(BufferedImage image) throws Exception {
		// 按指定宽高创建一个图像副本
		image = ImageHelper.getSubImage(image, 0, 0, image.getWidth(), image.getHeight());
		// 图像转换成灰度的简单方法 - 黑白处理
		image = ImageHelper.convertImageToGrayscale(image);
		// 图像缩放 - 放大n倍图像
		image = ImageHelper.getScaledInstance(image, image.getWidth() * 3, image.getHeight() * 3);
		return image;
	}

}
